/**
 * 交叉类型(&):功能类似于接口继承(extends),用于组合多个类型为一个类型(常用于对象类型)
 */



interface Point2 {
    x:number
    y:number
}

interface Point3 extends Point2 {
    z: number
}

let p3:Point3 = {
    x:1,
    y:2,
    z:3
} 


//交叉类型
interface Person {
    name:string,
    say(): number
}
interface Contact {phone:string}

type PersonDetail = Person & Contact

let obj: PersonDetail = {
    name: 'tom',
    phone: 'cat',
    say () {
        return 1
    }
}


// 交叉类型和接口继承的对比
// 相同点:都可以实现对象类型的组合
// 不同点: 两种方式实现类型组合时,对于 同名属性直接,处理类型冲突的方式不同



interface A {
    fn: (value:number) => string
}

// fn类型不兼容
// interface B extends A{
//     fn: (value:string) => string
// }


interface B {
    fn: (value:string) => string
}
type C = A & B
// 交叉类型可以理解成
// fn: (value: string | number) => string

let c:C = {
    fn (value: number | string) {
        return 'tom'
    }
}
// 函数的重载

// let c1:C
// c1.fn